package cn.tedu.service;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

@Service //ioc
@Aspect //标记着这是一个AOP的类:切面(由切点和通知组成)
public class AOPAspect {
    // 1.切点(指定具体要用的类或方法)和
    // 切点表达式:*是通配符 ..表示0~n个
              //方法返回值/包路径/包括子包/类名/方法名/参数列表
    @Pointcut("execution( * cn.tedu.service..*.*(..))")
    public void point(){

    }

    // 2.通知(是一个方法自定义功能)
    @Around("point()")//是一个环绕通知
    public Object doAround(ProceedingJoinPoint joinPoint)
            throws Throwable {
        long time = System.currentTimeMillis();
        //去执行你的业务方法
        Object o = joinPoint.proceed();
        time = System.currentTimeMillis()-time;

        String methodname = joinPoint.getTarget().getClass().getName()//获取类名
                +"."+joinPoint.getSignature().getName();//获取方法名
        System.out.println(methodname+"方法执行时间为: "+time);

        return o;
    }
}
